#include <QMouseEvent>
#include "Const.h"
#include "PictureCtrl.h"

/**
 * 构造方法。
 * @param hasBorder 有边框则为 true，否则为 false
 * @param image     图片
 * @param parent    父窗口
 * @param rect      位置、尺寸
 */
PictureCtrl::PictureCtrl(bool hasBorder, QImage* image, QWidget* parent, QRect* rect) :
    QWidget(parent, Qt::SubWindow),
    mHasBorder(hasBorder),
    mImage(image->copy(*rect)),
    mOriginalPosition(rect->left(), rect->top()),
    mPenLeftTop1(Const::COLOR_LEFT_TOP_1),
    mPenLeftTop2(Const::COLOR_LEFT_TOP_2),
    mPenRightBottom1(Const::COLOR_RIGHT_BOTTOM_1),
    mPenRightBottom2(Const::COLOR_RIGHT_BOTTOM_2) {
    // 连接信号与槽
    parent->parentWidget()->connect(this, SIGNAL(UM_PICTURE_CTRL_CLICK(QWidget*)), SLOT(onPictureCtrlClick(QWidget*)));

    // 设置尺寸和位置
    QWidget::setGeometry(*rect);
    QWidget::show();
}

/**
 * 画边框。
 */
void PictureCtrl::drawEdge() {
    int size = QWidget::width();

    mDrawer.setPen(mPenLeftTop1);
    mDrawer.drawLine(0, 0, size, 0);
    mDrawer.drawLine(0, 0, 0, size);

    mDrawer.setPen(mPenLeftTop2);
    mDrawer.drawLine(1, 1, size - 1, 1);
    mDrawer.drawLine(1, 1, 1, size - 1);

    mDrawer.setPen(mPenRightBottom1);
    mDrawer.drawLine(size, 0, size, size);
    mDrawer.drawLine(0, size, size, size);

    mDrawer.setPen(mPenRightBottom2);
    mDrawer.drawLine(size - 1, 1, size - 1, size - 1);
    mDrawer.drawLine(1, size - 1, size - 1, size - 1);
}

/**
 * 判断自身是否在初始位置。
 * @return 在初始位置则返回 true，否则返回 false
 */
bool PictureCtrl::isOnOriginalPosition() {
    return QWidget::pos() == mOriginalPosition;
}

/**
 * 鼠标左键抬起事件的响应方法。
 * @param e 事件相关信息
 */
void PictureCtrl::mouseReleaseEvent(QMouseEvent* e) {
    if (e->button() == Qt::LeftButton) {
        emit UM_PICTURE_CTRL_CLICK(this);
    }
}

/**
 * 重绘事件的响应方法。
 */
void PictureCtrl::paintEvent(QPaintEvent*) {
    mDrawer.begin(this);
    mDrawer.drawImage(0, 0, mImage);
    if (mHasBorder) {
        this->drawEdge();
    }
    mDrawer.end();
}

/**
 * 设置边框。
 * @param hasBorder 有边框则为 true，否则为 false
 */
void PictureCtrl::setBorder(bool hasBorder) {
    if (mHasBorder == hasBorder) {
        return;
    }
    mHasBorder = hasBorder;
    QWidget::update();
}
